package com.gdust.spzx.common.feign;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * ClassName: UserTokenOpenFeignInterceptor
 * Package: com.gdust.spzx.common.feign
 * Description:
 * 针对service-cart微服务是获取不到当前登录用户的信息。
 * 原因：service-order微服务调用service-cart微服务的时候，是通过openFeign进行调用，openFeign在调用的时候会丢失请求头
 * 解决方案：使用feign拦截器拦截请求，获取token，重新传递token
 *
 * @Author syun
 * @Create 2024/12/27 21:54
 * @Version 1.0
 */
public class UserTokenOpenFeignInterceptor implements RequestInterceptor {
    /**
     * apply 方法是 Feign 请求拦截器的核心方法，负责在每次请求发送之前执行。
     * 该方法会从当前的 HTTP 请求中提取用户的 token，并将其添加到 Feign 请求的头部，确保调用微服务时传递 token。
     *
     * @param requestTemplate Feign 请求的模板，通过它可以修改请求头、请求体等信息。
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 获取当前请求的上下文信息（ServletRequestAttributes），包含了当前请求的所有信息
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        // 从当前 HTTP 请求中获取请求对象
        HttpServletRequest request = requestAttributes.getRequest();
        // 从请求头中获取名为 "token" 的值，假设 token 是以这种方式传递的
        String token = request.getHeader("token");
        // 将 token 添加到 Feign 请求的头部，确保微服务调用时能够携带当前用户的 token
        requestTemplate.header("token",token);
    }
}
